# 下载中文字幕

import subprocess  # 导入 subprocess 模块以执行外部命令
import os
import glob

# 配置部分
PROXY = "http://127.0.0.1:10809"  # 设置代理
COOKIES_FILE = r"D:\Downloads\www.youtube.com_cookies.txt"  # 指定 cookies 文件
VIDEO_URL = "https://www.youtube.com/watch?v=GWGbOjlJDkU"  # 视频链接
ytdlp_path = "D:\\tool\\video\\yt-dlp.exe" # 提供 yt-dlp 的完整路径

CH_JSON = 'ch.json' # 中文字幕json

language = "zh-Hant" # 需要下载的字幕

def run_command_real_time(command):
    saveout = ''  # 初始化保存输出的字符串
    try:
        process = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE, text=True)  # 启动外部命令并允许获取标准输出和错误

        while True:  # 持续读取输出
            output = process.stdout.readline()  # 逐行读取输出
            if output == '' and process.poll() is not None:  # 如果没有输出且进程已结束，则退出循环
                break
            if output:  # 如果有输出
                print(output.strip())  # 打印当前输出行
                saveout += output.strip() + '\n'  # 将输出保存到字符串中

        return_code = process.poll()  # 获取命令的返回值
        if return_code != 0:  # 如果返回值不为0，表示命令执行失败
            error_output = process.stderr.read()  # 读取标准错误输出
            print(f"命令执行失败，返回码: {return_code}")  # 打印返回码
            print(f"错误信息: {error_output.strip()}")  # 打印错误信息

    except Exception as e:  # 捕获异常
        print(f"发生错误: {e}")  # 打印错误信息
    return saveout  # 返回保存的输出

if __name__ == "__main__":  # 如果是主程序
    
    download_command = [  # 定义下载字幕的命令
        ytdlp_path,
        "--skip-download",  # 跳过视频下载
        "--write-subs",  # 下载字幕
        "--sub-langs", language,  # 设置下载的字幕语言
        "--sub-format", "json3",  # 设置字幕格式为 json3
        "--proxy", PROXY,  # 使用配置的代理
        "--cookies", COOKIES_FILE,  # 使用配置的 cookies 文件
        VIDEO_URL  # 使用配置的视频链接
    ]
    
    print(' '.join(download_command))
    download_result = run_command_real_time(download_command)  # 执行下载命令并获取输出

    # 重命名字幕文件
    zm = glob.glob('*.json3')  # 查找当前目录下所有符合条件的文件
    if zm:  # 如果找到了文件
        original_file = zm[0]  # 假设只下载一个文件，取第一个
        # 如果目标文件已存在，则先删除
        if os.path.exists(CH_JSON):
            os.remove(CH_JSON)
            print(f"已删除已存在的文件: {CH_JSON}")  # 打印删除文件的提示
        os.rename(original_file, CH_JSON)  # 重命名下载的文件
        print(f"下载并保存的文件名: {CH_JSON}")  # 打印保存的文件名
        
        if os.path.exists(CH_JSON):  # 检查文件是否存在
            print(f"文件已保存为: {CH_JSON}")  # 打印保存的文件路径
        else:
            print("下载失败，未能保存文件。")  # 打印失败信息
    else:
        print("没有找到下载的字幕文件。")  # 如果没有找到文件，打印信息